package com.demo.stream_;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author gy
 * @date 2022/5/10
 * sorted, 中间操作。有两种排序
 * sorted():自然排序，流中元素需要实现 Comparable接口
 * sorted(Comparator com):Comparator排序器自定义排序
 */
public class StreamSorted {
    /**
     * 将员工按工资由高到低（工资一样则按年龄由大到小）排序
     */
    @Test
    public void m1(){
        List<Person> personList = new ArrayList<Person>();

        personList.add(new Person("Sherry", 9000, 24, "female", "New York"));
        personList.add(new Person("Tom", 8900, 22, "male", "Washington"));
        personList.add(new Person("Jack", 9000, 25, "male", "Washington"));
        personList.add(new Person("Lily", 8800, 26, "male", "New York"));
        personList.add(new Person("Alisa", 9000, 26, "female", "New York"));

        // 按工资升序排序（自然排序）
        List<String> newList = personList.stream().sorted(Comparator.comparing(Person::getSalary))
                .map(Person::getName)
                .collect(Collectors.toList());

        // 按工资倒序排序  关键操作 reversed() 实现对流元素的反转
        List<String> newList2 = personList.stream().sorted(Comparator.comparing(Person::getSalary).reversed())
                .map(Person::getName)
                .collect(Collectors.toList());

        // 先按工资再按年龄升序排序 关键操作 thenComparing(Person::getAge)
        // 同样可以配合 reverse() 实现降序排序
        // 排序的关键是 先后顺序  而不是 升序，降序；但并不是说升降序不重要，而是在优先级面前，显得不是那么重要
        List<String> newList3 = personList.stream().
                sorted(Comparator.comparing(Person::getSalary).thenComparing(Person::getAge))
                .map(Person::getName)
                .collect(Collectors.toList());

        // 先按工资再按年龄自定义排序（降序）
        // 思路分析：先写特例，然后取反 或者 else 来处理其他的情况
        // 此处：特例就是 工资相同的情况，要按照 年龄来进行排序
        //      工资不同 就按照工资来排
        List<String> newList4 = personList.stream().sorted((p1, p2) -> {
            if (p1.getSalary() == p2.getSalary()) {
                // 工资相同的情况 按照年龄来进行排序
                return p2.getAge() - p1.getAge();
            } else {
                return p2.getSalary() - p1.getSalary();
            }
        }).map(Person::getName).collect(Collectors.toList());

        System.out.println("按工资升序排序：" + newList);
        System.out.println("按工资降序排序：" + newList2);
        System.out.println("先按工资再按年龄升序排序：" + newList3);
        System.out.println("先按工资再按年龄自定义降序排序：" + newList4);

    }

}
